package exrefelect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 普通方法类 Method 的使用
 * @author: knowno
 * @create: 2025-09-17 14:26
 * @Version 1.0
 **/
public class TestMethod {
    public static void main(String[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException {

        //得到一个Person类的Class对象
        Class cls = Person.class;

        //获取普通方法
        //1 获取方法 ->getMethods ->只能获取public的构造方法 ,包括从父类继承的
        System.out.println("************getMethods**********");
        Method[] methods = cls.getMethods();

        for (Method method : methods) {
            System.out.println(method+" "+method.getModifiers());
        }


        System.out.println("************getDeclaredMethods**********");

        //2 获取所有的方法 ->getDeclaredMethods->可以获取所有的方法,包括私有的
        Method[] declaredMethods = cls.getDeclaredMethods();

        for (Method m : declaredMethods) {
            System.out.println(m+" "+m.getModifiers());
            //调用私有的方法
            if (m.getModifiers()==2) {
                //调用私有的方法(作弊)
                m.setAccessible(true);
                //invoke 调用方法
                m.invoke(new Person(),null);
            }
            if (m.getModifiers()==1){
                //调用公有的方法 toString
                System.out.println(m.invoke(new Person(), null));
            }
            if (m.getModifiers()==9){
                //调用公有的方法 toString
                m.invoke(new Person(), null);
            }
        }

    }
}
